bitkeeper revision 1.1159.1.174 (41544174lO23TSzrMCtW6FnECUFlnQ)
authormjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 24 Sep 2004 15:47:00 +0000 (15:47 +0000)
committermjw@wray-m-3.hpl.hp.com <mjw@wray-m-3.hpl.hp.com>
Fri, 24 Sep 2004 15:47:00 +0000 (15:47 +0000)
Revert to constructing image first when creating a domain - doing
it later breaks restore.

tools/libxc/xc_io.h
tools/python/xen/xend/XendDomainInfo.py
tools/xfrd/xen_domain.c
tools/xfrd/xfrd.c

index 00ed66dc247a42f11e8c744b0f97405c234be00c..4feca0b358434012283e6dd0572e7fd3bccd324b 100644 (file)
@@ -13,7 +13,8 @@ typedef struct XcIOContext {
     IOStream *err;
     char *vmconfig;
     int vmconfig_n;
-    int (*suspend)(u32 domain, void *data);
+    int (*suspend)(void *data, u32 domain);
+    int (*configure)(void *data, u32 domain, char *vmconfig, int vmconfig_n);
     void *data;
 } XcIOContext;
 
@@ -21,7 +22,18 @@ static inline int xcio_suspend_domain(XcIOContext *ctxt){
     int err = 0;
 
     if(ctxt->suspend){
-        err = ctxt->suspend(ctxt->domain, ctxt->data);
+        err = ctxt->suspend(ctxt->data, ctxt->domain);
+    } else {
+        err = -EINVAL;
+    }
+    return err;
+}
+
+static inline int xcio_configure_domain(XcIOContext *ctxt){
+    int err = 0;
+
+    if(ctxt->configure){
+        err = ctxt->configure(ctxt->data, ctxt->domain, ctxt->vmconfig, ctxt->vmconfig_n);
     } else {
         err = -EINVAL;
     }
index 852f449011305fa7f5827d569246ae78baf0fb9f..647956f7bed47a3ba5fd222fe4d2039fd3849ef6 100644 (file)
@@ -500,16 +500,14 @@ class XendDomainInfo:
                 raise VmError('missing memory size')
 
             self.init_domain()
+            self.construct_image()
             self.configure_console()
             self.configure_restart()
             self.configure_backends()
             deferred = self.configure()
-            def cbok(val):
-                return self.construct_image()
             def cberr(err):
                 self.destroy()
                 return err
-            deferred.addCallback(cbok)
             deferred.addErrback(cberr)
         except StandardError, ex:
             # Catch errors, cleanup and re-raise.
@@ -651,12 +649,7 @@ class XendDomainInfo:
         devices have been released.
         """
         if self.dom is None: return 0
-        if self.console:
-            if self.restart_pending():
-                self.console.deregisterChannel()
-            else:
-                log.debug('Closing console, domain %s', self.id)
-                self.console.close()
+        self.destroy_console()
         chan = xend.getDomChannel(self.dom)
         if chan:
             log.debug("Closing channel to domain %d", self.dom)
@@ -666,6 +659,14 @@ class XendDomainInfo:
         except Exception, err:
             log.exception("Domain destroy failed: %s", self.name)
 
+    def destroy_console(self):
+        if self.console:
+            if self.restart_pending():
+                self.console.deregisterChannel()
+            else:
+                log.debug('Closing console, domain %s', self.id)
+                self.console.close()
+
     def cleanup(self):
         """Cleanup vm resources: release devices.
         """
index fe63e73a3d0c4aad370f88967be57c946c5d8257..fd7dd5f99ec7666a9f64c75a45d61a756776a75e 100644 (file)
@@ -16,11 +16,10 @@ typedef unsigned long u32;
 
 #define MODULE_NAME "XFRD"
 #define DEBUG 1
-#undef DEBUG
+//#undef DEBUG
 #include "debug.h"
 
-
-int domain_suspend(u32 dom, void *data){
+int domain_suspend(void *data, u32 dom){
     int err = 0;
     Conn *xend = data;
 
@@ -30,6 +29,10 @@ int domain_suspend(u32 dom, void *data){
     return err;
 }
 
+int domain_configure(void *data, u32 dom, char *vmconfig, int vmconfig_n){
+    return xen_domain_configure(dom, vmconfig, vmconfig_n);
+}
+
 #ifndef _XEN_XFR_STUB_
 static int xc_handle = 0;
 
@@ -131,6 +134,7 @@ int xen_domain_rcv(IOStream *io, uint32_t *dom, char **vmconfig, int *vmconfig_n
     ioctxt->io = io;
     ioctxt->info = iostdout;
     ioctxt->err = iostderr;
+    ioctxt->configure = domain_configure;
 
     err = xc_linux_restore(xcinit(), ioctxt);
     *dom = ioctxt->domain;
index f84e29e6a2847dadff5f89ba93d0e2ed10418eeb..93062ca8fb3d900730ea161d8f8d722c9fd2b7ce 100644 (file)
@@ -49,8 +49,8 @@
 #include "select.h"
 
 #define MODULE_NAME "XFRD"
-#define DEBUG 0
-#undef DEBUG
+#define DEBUG 1
+//#undef DEBUG
 #include "debug.h"
 
 /*
@@ -796,7 +796,6 @@ int xfr_recv(Args *args, XfrState *state, Conn *peer){
     // before we configure the new one.
     err = Conn_sxpr(peer, &sxpr);
     if(err) goto exit;
-    //sleep(2);
     err = xen_domain_configure(state->vmid_new, state->vmconfig, state->vmconfig_n);
     if(err) goto exit;
     err = xen_domain_unpause(state->vmid_new);
@@ -916,7 +915,7 @@ int xfrd_accept(Args *args, int sock){
     pid_t pid;
     int err = 0;
     
-    dprintf(">\n");
+    dprintf("> sock=%d\n", sock);
     dprintf("> accept...\n");
     peersock = accept(sock, peer, &peer_n);
     dprintf("> accept=%d\n", peersock);
@@ -925,8 +924,8 @@ int xfrd_accept(Args *args, int sock){
         err = -errno;
         goto exit;
     }
-    iprintf("> Accepted connection from %s:%d\n",
-            inet_ntoa(peer_in.sin_addr), htons(peer_in.sin_port));
+    iprintf("> Accepted connection from %s:%d on %d\n",
+            inet_ntoa(peer_in.sin_addr), htons(peer_in.sin_port), sock);
     pid = fork();
     if(pid > 0){
         // Parent, fork succeeded.